package org.alex.samples.util;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {

	@Pointcut("execution(* org.alex.samples.web.*.*(..))")
	public void allMethod(){
	}
	
	@Pointcut("execution(* org.alex.samples.web.*.edit*(..))")
	public void edit(){
	}
	
	@Pointcut("execution(* org.alex.samples.web.*.update*(..))")
	public void update(){
	}
	
	@Pointcut("execution(* org.alex.samples.web.*.delete*(..))")
	public void delete(){
	}
	
	@Around("edit() || update() || delete()")
	public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("AROUND------------进入环绕通知");
		Object object=pjp.proceed();
		System.out.println("AROUND------------结束方法调用");
		return object;
	}
	
	@After("edit() || update() || delete()" )
	public void afterLog(JoinPoint point){
		System.out.println("afterLog------------最终通知");
		System.out.println("afterLog------------目标方法为：" + point.getSignature().getDeclaringTypeName() + "."
				+ point.getSignature().getName());
		System.out.println("afterLog------------参数为：" + Arrays.toString(point.getArgs()));
		System.out.println("afterLog------------被织入的目标对象为：" + point.getTarget());
	}
	
	@AfterReturning(value = "edit() || update() || delete()",returning ="returnValue" )
	public void afterReturningLog(JoinPoint point,Object returnValue){
		System.out.println("afterReturningLog------------返回值后得通知");
		System.out.println("afterReturningLog------------目标方法为：" + point.getSignature().getDeclaringTypeName() + "."
				+ point.getSignature().getName());
		System.out.println("afterReturningLog------------参数为：" + Arrays.toString(point.getArgs()));
		System.out.println("afterReturningLog------------返回值为：" + returnValue);
	}
	
	
	@AfterThrowing(throwing = "ex" ,value = "edit() || update() || delete()" )
	public void afterThrowingLog(Throwable ex){
		System.out.println("afterThrowingLog------------进入异常通知" );
		System.out.println("afterThrowingLog------------异常信息：" +ex.getMessage());
	}
		
	
}
